package models

import (
	"cgs-server/helper"
	"cgs-server/server/model"
	"go.mongodb.org/mongo-driver/bson/primitive"
	"time"
)

const (
	FillInfinity = iota
	FillOnce
	FillOnceEveryDay
)

type PublicWorksheet struct {
	Id           primitive.ObjectID `json:"id" bson:"id"`
	WorksheetId  string             `json:"worksheetId" bson:"worksheetId"`
	Title        string             `json:"title" bson:"title"`
	FieldSetting map[string]bool    `json:"fieldSetting" bson:"fieldSetting"` // 字段设置，是否隐藏
	Url          string             `json:"url" bson:"url"`
	Qrcode       string             `json:"qrcode" bson:"qrcode"`       // 二维码地址
	ShareId      string             `json:"shareId" bson:"shareId"`     // 分享id
	FillTimes    *int               `json:"fillTimes" bson:"fillTimes"` // 填写次数，0：无限制，1：仅一次，2：每天一次
	Receipt      string             `json:"receipt" bson:"receipt"`     // 填写成功的回执
	Enabled      *bool              `json:"enabled" bson:"enabled"`     // 是否启用
	ExtParam     *ExtParam          `json:"extParam" bson:"extParam"`   // 扩展参数

	WorksheetInfo *WorksheetInfo `json:"worksheetInfo" bson:"-"` // 返回表结构

	LastFillTime *time.Time `json:"lastFillTime" bson:"lastFillTime"` // 最后一次填写时间

	CouldFill bool `json:"couldFill"` // 是否可以填写

	model.TenantModel
}

func (p *PublicWorksheet) SetId(id primitive.ObjectID) {
	p.Id = id
}

func (p *PublicWorksheet) GetId() string {
	return p.Id.Hex()
}

func (p *PublicWorksheet) ResolveCouldFill() {
	if p.Enabled == nil || !*p.Enabled {
		p.CouldFill = false
		return
	}
	if p.LastFillTime == nil {
		p.CouldFill = true
		return
	}
	if p.FillTimes == nil {
		return
	}
	switch *p.FillTimes {
	case FillInfinity:
		p.CouldFill = true
	case FillOnce:
		p.CouldFill = false
	case FillOnceEveryDay:
		after := helper.GetZeroTime(time.Now()).After(*p.LastFillTime)
		p.CouldFill = after
	}
}

type ExtParam struct {
	ExtField string  `json:"extField" bson:"extField"`
	ExtUrls  ExtUrls `json:"extUrls" bson:"-"`
}

// ExtUrl 单独存
type ExtUrl struct {
	Id          primitive.ObjectID `json:"id" bson:"id"`
	Param       string             `json:"param" bson:"param"`
	Url         string             `json:"url" bson:"url"`
	Qrcode      string             `json:"qrcode" bson:"qrcode"`
	WorksheetId string             `json:"worksheetId" bson:"worksheetId"`
}

func (e *ExtUrl) SetId(id primitive.ObjectID) {
	e.Id = id
}
func (e *ExtUrl) GetId() string {
	return e.Id.Hex()
}

type ExtUrls []*ExtUrl
